#ifndef DATAEXPORTER_H
#define DATAEXPORTER_H

#include <QObject>
#include <QDateTime>
#include <QStringList>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonDocument>
#include <QTimer>
#include <QMap>
#include <functional>
#include "auditlogger.h"

/**
 * @brief 支持的导出格式枚举
 * 定义系统支持的各种数据导出格式
 */
enum class ExportFormat {
    CSV,        // 逗号分隔值格式
    JSON,       // JavaScript对象表示法格式
    XML,        // 可扩展标记语言格式
    PDF,        // 便携式文档格式
    EXCEL,      // Microsoft Excel格式
    HTML        // 超文本标记语言格式
};

/**
 * @brief 导出过滤条件结构体
 * 定义数据导出时的各种过滤条件
 */
struct ExportFilter {
    QDateTime startDate;                    // 开始日期
    QDateTime endDate;                      // 结束日期
    QStringList userIds;                    // 用户ID列表
    QStringList actions;                    // 操作类型列表
    QStringList tableNames;                 // 表名列表
    QString searchText;                     // 搜索文本
    bool includeSystemEvents = true;        // 是否包含系统事件
    bool includeUserEvents = true;          // 是否包含用户事件
    int maxRecords = -1;                    // 最大记录数（-1表示无限制）
};

/**
 * @brief 导出配置结构体
 * 定义完整的数据导出配置信息
 */
struct ExportConfig {
    ExportFormat format;                    // 导出格式
    QString outputPath;                     // 输出路径
    ExportFilter filter;                    // 过滤条件
    bool includeHeaders = true;             // 是否包含表头
    bool compressOutput = false;            // 是否压缩输出
    bool encryptOutput = false;             // 是否加密输出
    QString encryptionPassword;             // 加密密码
    QStringList selectedColumns;            // 选中的列
    QString templatePath;                   // 自定义模板路径
};

/**
 * @brief 数据导出器类
 * 负责将审计数据导出为各种格式，支持高级过滤、模板、批量和定时导出
 */
class DataExporter : public QObject
{
    Q_OBJECT

public:
    explicit DataExporter(QObject *parent = nullptr);
    
    // ==================== 主要导出功能 ====================
    
    /**
     * @brief 主要数据导出函数
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportData(const ExportConfig &config);
    
    // ==================== 格式特定的导出函数 ====================
    
    /**
     * @brief 导出为CSV格式
     * @param filePath 文件路径
     * @param records 审计记录
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportToCSV(const QString &filePath, const QVector<AuditLogger::AuditRecord> &records, 
                     const ExportConfig &config);
    
    /**
     * @brief 导出为JSON格式
     * @param filePath 文件路径
     * @param records 审计记录
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportToJSON(const QString &filePath, const QVector<AuditLogger::AuditRecord> &records, 
                      const ExportConfig &config);
    
    /**
     * @brief 导出为XML格式
     * @param filePath 文件路径
     * @param records 审计记录
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportToXML(const QString &filePath, const QVector<AuditLogger::AuditRecord> &records, 
                     const ExportConfig &config);
    
    /**
     * @brief 导出为PDF格式
     * @param filePath 文件路径
     * @param records 审计记录
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportToPDF(const QString &filePath, const QVector<AuditLogger::AuditRecord> &records, 
                     const ExportConfig &config);
    
    /**
     * @brief 导出为Excel格式
     * @param filePath 文件路径
     * @param records 审计记录
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportToExcel(const QString &filePath, const QVector<AuditLogger::AuditRecord> &records, 
                       const ExportConfig &config);
    
    /**
     * @brief 导出为HTML格式
     * @param filePath 文件路径
     * @param records 审计记录
     * @param config 导出配置
     * @return 导出是否成功
     */
    bool exportToHTML(const QString &filePath, const QVector<AuditLogger::AuditRecord> &records, 
                      const ExportConfig &config);
    
    // ==================== 实用工具函数 ====================
    
    /**
     * @brief 获取所有可用的导出格式
     * @return 格式名称列表
     */
    QStringList getAvailableFormats() const;
    
    /**
     * @brief 获取指定格式的文件扩展名
     * @param format 导出格式
     * @return 文件扩展名
     */
    QString getFormatExtension(ExportFormat format) const;
    
    /**
     * @brief 获取指定格式的描述信息
     * @param format 导出格式
     * @return 格式描述
     */
    QString getFormatDescription(ExportFormat format) const;
    
    // ==================== 模板管理功能 ====================
    
    /**
     * @brief 加载导出模板
     * @param templatePath 模板文件路径
     * @return 加载是否成功
     */
    bool loadTemplate(const QString &templatePath);
    
    /**
     * @brief 保存导出模板
     * @param templatePath 模板文件路径
     * @param config 导出配置
     * @return 保存是否成功
     */
    bool saveTemplate(const QString &templatePath, const ExportConfig &config);
    
    /**
     * @brief 获取所有可用的模板
     * @return 模板名称列表
     */
    QStringList getAvailableTemplates() const;
    
    // ==================== 批量导出功能 ====================
    
    /**
     * @brief 批量导出多个配置
     * @param configs 导出配置列表
     * @return 批量导出是否成功
     */
    bool exportBatch(const QList<ExportConfig> &configs);
    
    // ==================== 定时导出功能 ====================
    
    /**
     * @brief 安排定时导出
     * @param config 导出配置
     * @param scheduleTime 计划执行时间
     */
    void scheduleExport(const ExportConfig &config, const QDateTime &scheduleTime);
    
    /**
     * @brief 取消定时导出
     * @param exportId 导出任务ID
     */
    void cancelScheduledExport(const QString &exportId);
    
    // ==================== 进度跟踪功能 ====================
    
    /**
     * @brief 获取当前导出进度
     * @return 进度百分比（0-100）
     */
    int getExportProgress() const;
    
    /**
     * @brief 获取当前导出状态
     * @return 状态描述字符串
     */
    QString getCurrentExportStatus() const;
    
    // ==================== 数据验证功能 ====================
    
    /**
     * @brief 验证导出配置的有效性
     * @param config 导出配置
     * @param errorMessage 错误信息输出
     * @return 配置是否有效
     */
    bool validateExportConfig(const ExportConfig &config, QString &errorMessage);
    
    // ==================== 插件系统集成 ====================
    
    /**
     * @brief 注册自定义导出器（用于插件扩展）
     * @param formatName 格式名称
     * @param exporter 导出函数
     * @return 注册是否成功
     */
    bool registerCustomExporter(const QString &formatName, 
                               std::function<bool(const QString&, const QVector<AuditLogger::AuditRecord>&, const ExportConfig&)> exporter);
    
    /**
     * @brief 注销自定义导出器
     * @param formatName 格式名称
     * @return 注销是否成功
     */
    bool unregisterCustomExporter(const QString &formatName);

signals:
    void exportStarted(const QString &exportId);
    void exportProgress(const QString &exportId, int percentage);
    void exportCompleted(const QString &exportId, bool success, const QString &outputPath);
    void exportError(const QString &exportId, const QString &error);

private slots:
    void onScheduledExportTriggered();

private:
    AuditLogger *m_auditLogger;
    int m_currentProgress;
    QString m_currentStatus;
    QString m_currentExportId;
    
    // Custom exporters for plugin system
    QMap<QString, std::function<bool(const QString&, const QVector<AuditLogger::AuditRecord>&, const ExportConfig&)>> m_customExporters;
    
    // Scheduled exports
    QMap<QString, QTimer*> m_scheduledExports;
    QMap<QString, ExportConfig> m_scheduledConfigs;
    
    // Helper functions
    QVector<AuditLogger::AuditRecord> filterRecords(const QVector<AuditLogger::AuditRecord> &records, 
                                                   const ExportFilter &filter);
    QString generateExportId() const;
    bool compressFile(const QString &filePath);
    bool encryptFile(const QString &filePath, const QString &password);
    QString escapeCSVField(const QString &field) const;
    QString formatDateTime(const QDateTime &dateTime) const;
    QJsonObject recordToJson(const AuditLogger::AuditRecord &record) const;
    QString recordToXML(const AuditLogger::AuditRecord &record) const;
    QString recordToHTML(const AuditLogger::AuditRecord &record) const;
    
    // Template processing
    QString processTemplate(const QString &templateContent, const QVector<AuditLogger::AuditRecord> &records) const;
    QMap<QString, QString> m_templates;
    
    void updateProgress(int percentage);
    void setStatus(const QString &status);
};

#endif // DATAEXPORTER_H